/*	--- JDBC Batch ---

使用【JDBC】操作【数据库】的时候，经常会执行一些批量操作。

例如，【一次性给会员增加可用优惠券若干】，我们可以执行以下SQL代码：

	INSERT INTO coupons (user_id, type, expires) VALUES (123, 'DISCOUNT', '2030-12-31');
	INSERT INTO coupons (user_id, type, expires) VALUES (234, 'DISCOUNT', '2030-12-31');
	INSERT INTO coupons (user_id, type, expires) VALUES (345, 'DISCOUNT', '2030-12-31');
	INSERT INTO coupons (user_id, type, expires) VALUES (456, 'DISCOUNT', '2030-12-31');
	...



实际上【执行JDBC】时，因为只有【占位符】参数不同，所以SQL实际上是一样的：*/
for (var params : paramsList) {
	PreparedStatement ps = conn.preparedStatement("INSERT INTO coupons (user_id, type, expires) VALUES (?,?,?)");

    ps.setLong(params.get(0));
    ps.setString(params.get(1));
    ps.setString(params.get(2));

    ps.executeUpdate();
}


/*
类似的还有，给每个员工薪水增加10%～30%：
	UPDATE employees SET salary = salary * ? WHERE id = ?

通过【一个循环】来执行【每个PreparedStatement】虽然可行，但是性能很低。


【SQL数据库】对【SQL语句相同,但只有参数不同的若干语句】可以作为【batch执行】,即【批量执行】，这种【操作】有【特别优化】，速度远远快于循环执行每个SQL。


在JDBC代码中，我们可以利用【SQL数据库的这一特性】，把同一个SQL但参数不同的若干次操作合并为一个batch执行。我们以批量插入为例，示例代码如下： */
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (name, gender, grade, score) VALUES (?, ?, ?, ?)")) {
    // 对同一个PreparedStatement反复设置参数并调用addBatch():
    for (String name : names) {
        ps.setString(1, name);
        ps.setBoolean(2, gender);
        ps.setInt(3, grade);
        ps.setInt(4, score);

        ps.addBatch(); // 添加到batch
    }

    // 执行batch:
    int[] ns = ps.executeBatch(); // <--- 核心: 执行批量

    for (int n : ns) {
        System.out.println(n + " inserted."); // batch中每个SQL执行的结果数量
    }
}


/*
执行batch和执行一个SQL不同点在于，需要对同一个PreparedStatement反复设置参数并调用addBatch()，这样就相当于给一个SQL加上了多组参数，相当于变成了“多行”SQL。


第二个不同点是调用的不是executeUpdate()，而是executeBatch()，因为我们设置了多组参数，相应地，返回结果也是多个int值，因此返回类型是int[]，循环int[]数组即可获取每组参数执行后影响的结果数量。



============================================================


#	----- JDBC Batch の 小结 -----


1. 使用【JDBC的batch操作】会大大提高【执行效率】，对【内容相同,参数不同的SQL语句】,要优先考虑【batch操作】。


--------------

模版：

try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (name, gender, grade, score) VALUES (?, ?, ?, ?)")) {
    // 对同一个PreparedStatement反复设置参数并调用addBatch():
    for (String name : names) {
        ps.setString(1, name);
        ps.setBoolean(2, gender);
        ps.setInt(3, grade);
        ps.setInt(4, score);

        ps.addBatch(); // 添加到batch
    }

    // 执行batch:
    int[] ns = ps.executeBatch(); // <--- 核心: 执行批量

    for (int n : ns) {
        System.out.println(n + " inserted."); // batch中每个SQL执行的结果数量
    }
}


































